home *** CD-ROM | disk | FTP | other *** search
- /* TrackList.c */
- /*****************************************************************************/
- /* */
- /* Out Of Phase: Digital Music Synthesis on General Purpose Computers */
- /* Copyright (C) 1994 Thomas R. Lawrence */
- /* */
- /* This program is free software; you can redistribute it and/or modify */
- /* it under the terms of the GNU General Public License as published by */
- /* the Free Software Foundation; either version 2 of the License, or */
- /* (at your option) any later version. */
- /* */
- /* This program is distributed in the hope that it will be useful, */
- /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
- /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
- /* GNU General Public License for more details. */
- /* */
- /* You should have received a copy of the GNU General Public License */
- /* along with this program; if not, write to the Free Software */
- /* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
- /* */
- /* Thomas R. Lawrence can be reached at tomlaw@world.std.com. */
- /* */
- /*****************************************************************************/
-
- #include "MiscInfo.h"
- #include "Audit.h"
- #include "Debug.h"
- #include "Definitions.h"
-
- #include "TrackList.h"
- #include "StringList.h"
- #include "Array.h"
- #include "Memory.h"
- #include "TrackObject.h"
- #include "Alert.h"
- #include "DataMunging.h"
- #include "Menus.h"
- #include "BufferedFileInput.h"
- #include "BufferedFileOutput.h"
- #include "Files.h"
- #include "Scrap.h"
- #include "TrackBackgroundSaver.h"
-
-
- struct TrackListRec
- {
- StringListRec* List;
- struct CodeCenterRec* CodeCenter;
- struct MainWindowRec* MainWindow;
- ArrayRec* TrackArray;
- MyBoolean TrackListChanged;
- MenuType* TrackMenu;
- };
-
-
- #define MAGICSCRAPSTRING ("\xff\x00\x1f\xfe TrackObjectScrap")
-
-
- /* create a new track list */
- TrackListRec* NewTrackList(struct MainWindowRec* MainWindow,
- struct CodeCenterRec* CodeCenter, WinType* ScreenID,
- OrdType XLoc, OrdType YLoc, OrdType Width, OrdType Height)
- {
- TrackListRec* TrackList;
-
- TrackList = (TrackListRec*)AllocPtrCanFail(sizeof(TrackListRec),"TrackListRec");
- if (TrackList == NIL)
- {
- FailurePoint1:
- return NIL;
- }
- TrackList->TrackArray = NewArray();
- if (TrackList->TrackArray == NIL)
- {
- FailurePoint2:
- ReleasePtr((char*)TrackList);
- goto FailurePoint1;
- }
- TrackList->List = NewStringList(ScreenID,XLoc,YLoc,Width,Height,
- GetScreenFont(),9,StringListDontAllowMultipleSelection,"Tracks");
- if (TrackList->List == NIL)
- {
- FailurePoint3:
- DisposeArray(TrackList->TrackArray);
- goto FailurePoint2;
- }
- TrackList->TrackMenu = MakeNewMenu("Tracks");
- if (TrackList->TrackMenu == NIL)
- {
- FailurePoint4:
- DisposeStringList(TrackList->List);
- goto FailurePoint3;
- }
- TrackList->CodeCenter = CodeCenter;
- TrackList->MainWindow = MainWindow;
- TrackList->TrackListChanged = False;
- return TrackList;
- }
-
-
- /* delete the track list and all of the tracks it contains */
- void DisposeTrackList(TrackListRec* TrackList)
- {
- CheckPtrExistence(TrackList);
- while (ArrayGetLength(TrackList->TrackArray) > 0)
- {
- TrackObjectRec* TrackTemp;
-
- TrackTemp = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,0);
- /* we remove it from the array since deleting it may cause a callback */
- /* to tell others that it is being deleted, so we don't want to have */
- /* nonexistent objects in our array */
- ArrayDeleteElement(TrackList->TrackArray,0);
- DisposeTrackObject(TrackTemp);
- }
- DisposeArray(TrackList->TrackArray);
- DisposeStringList(TrackList->List);
- KillMenuAndDeleteItems(TrackList->TrackMenu);
- ReleasePtr((char*)TrackList);
- }
-
-
- /* change the location of the track list in the window */
- void SetTrackListLocation(TrackListRec* TrackList,
- OrdType XLoc, OrdType YLoc, OrdType Width, OrdType Height)
- {
- CheckPtrExistence(TrackList);
- SetStringListLoc(TrackList->List,XLoc,YLoc,Width,Height);
- }
-
-
- /* redraw the list */
- void TrackListRedraw(TrackListRec* TrackList)
- {
- CheckPtrExistence(TrackList);
- RedrawStringList(TrackList->List);
- }
-
-
- /* see if the specified coordinates falls inside the track list rectangle */
- MyBoolean TrackListHitTest(TrackListRec* TrackList,
- OrdType XLoc, OrdType YLoc)
- {
- CheckPtrExistence(TrackList);
- return StringListHitTest(TrackList->List,XLoc,YLoc);
- }
-
-
- /* handle a mouse down event for the track list */
- void TrackListDoMouseDown(TrackListRec* TrackList,
- OrdType XLoc, OrdType YLoc, ModifierFlags Modifiers)
- {
- CheckPtrExistence(TrackList);
- if (StringListMouseDown(TrackList->List,XLoc,YLoc,Modifiers))
- {
- /* if it returns true, then it was a double click */
- TrackListOpenSelection(TrackList);
- }
- }
-
-
- /* called when the window becomes active */
- void TrackListBecomeActive(TrackListRec* TrackList)
- {
- CheckPtrExistence(TrackList);
- EnableStringList(TrackList->List);
- }
-
-
- /* called when the window becomes inactive */
- void TrackListBecomeInactive(TrackListRec* TrackList)
- {
- CheckPtrExistence(TrackList);
- DisableStringList(TrackList->List);
- }
-
-
- /* called when a selection is made in another list, so that this list */
- /* is deselected */
- void TrackListDeselect(TrackListRec* TrackList)
- {
- CheckPtrExistence(TrackList);
- DeselectAllStringListElements(TrackList->List);
- }
-
-
- /* check to see if there is a selection in this list */
- MyBoolean TrackListIsThereSelection(TrackListRec* TrackList)
- {
- CheckPtrExistence(TrackList);
- return (GetStringListHowManySelectedItems(TrackList->List) > 0);
- }
-
-
- /* check to see if any of the tracks contained in this list need to be saved */
- MyBoolean DoesTrackListNeedToBeSaved(TrackListRec* TrackList)
- {
- long Scan;
- long Limit;
- MyBoolean Flag;
-
- CheckPtrExistence(TrackList);
- Flag = TrackList->TrackListChanged;
- Limit = ArrayGetLength(TrackList->TrackArray);
- for (Scan = 0; (Scan < Limit) && !Flag; Scan += 1)
- {
- TrackObjectRec* TrackTemp;
-
- TrackTemp = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- if (HasTrackObjectBeenModified(TrackTemp))
- {
- Flag = True;
- }
- }
- return Flag;
- }
-
-
- /* open an edit window for the selected track */
- void TrackListOpenSelection(TrackListRec* TrackList)
- {
- ArrayRec* ListOfSelections;
-
- CheckPtrExistence(TrackList);
- ListOfSelections = GetListOfSelectedItems(TrackList->List);
- if (ListOfSelections != NIL)
- {
- long Scan;
- long Limit;
-
- Limit = ArrayGetLength(ListOfSelections);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- TrackObjectRec* TrackTemp;
-
- TrackTemp = (TrackObjectRec*)ArrayGetElement(ListOfSelections,Scan);
- TrackObjectOpenWindow(TrackTemp);
- }
- DisposeArray(ListOfSelections);
- }
- }
-
-
- /* create a new track and open a window for it */
- void TrackListNewTrack(TrackListRec* TrackList)
- {
- TrackObjectRec* Track;
-
- CheckPtrExistence(TrackList);
- /* create the object */
- Track = NewTrackObject(TrackList->CodeCenter,TrackList->MainWindow,TrackList);
- if (Track == NIL)
- {
- FailurePoint1:
- AlertHalt("There is not enough memory available to create a new track.",NIL);
- return;
- }
- /* add it to the string list */
- if (!InsertStringListElement(TrackList->List,NIL,NIL,Track,True))
- {
- FailurePoint2:
- DisposeTrackObject(Track);
- goto FailurePoint1;
- }
- MainWindowDeselectAllOtherStringLists(TrackList->MainWindow,TrackList);
- SelectStringListElement(TrackList->List,Track);
- MakeStringListSelectionVisible(TrackList->List);
- /* add it to the array */
- if (!ArrayAppendElement(TrackList->TrackArray,Track))
- {
- FailurePoint3:
- RemoveStringListElement(TrackList->List,Track,True);
- goto FailurePoint2;
- }
- /* update our internal flags */
- TrackList->TrackListChanged = True;
- /* change the name in the list */
- TrackListTrackNameChanged(TrackList,Track);
- /* show the window */
- TrackObjectOpenWindow(Track);
- }
-
-
- /* delete the selected track */
- void TrackListDeleteSelection(TrackListRec* TrackList)
- {
- ArrayRec* ListOfSelections;
-
- CheckPtrExistence(TrackList);
- ListOfSelections = GetListOfSelectedItems(TrackList->List);
- if (ListOfSelections != NIL)
- {
- long Scan;
- long Limit;
-
- Limit = ArrayGetLength(ListOfSelections);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- TrackObjectRec* OneToZap;
-
- OneToZap = (TrackObjectRec*)ArrayGetElement(ListOfSelections,Scan);
- TrackListDeleteTrack(TrackList,OneToZap);
- }
- DisposeArray(ListOfSelections);
- }
- }
-
-
- /* delete the explicitly specified track */
- void TrackListDeleteTrack(TrackListRec* TrackList,
- struct TrackObjectRec* TheTrack)
- {
- long Scan;
- long Limit;
-
- CheckPtrExistence(TrackList);
- Limit = ArrayGetLength(TrackList->TrackArray);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- TrackObjectRec* TrackTemp;
-
- TrackTemp = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- if (TheTrack == TrackTemp)
- {
- FileSpec* BackupFileWhere;
- FileType* BackupFile;
- MyBoolean Success = False;
-
- BackupFileWhere = NewTempFileSpec(CODE4BYTES('?','?','?','?'),
- CODE4BYTES('?','?','?','?'));
- if (BackupFileWhere != NIL)
- {
- if (OpenFile(BackupFileWhere,&BackupFile,eReadAndWrite))
- {
- BufferedOutputRec* Output;
-
- Output = NewBufferedOutput(BackupFile);
- if (Output != NIL)
- {
- if (WriteBufferedOutput(Output,sizeof(MAGICSCRAPSTRING),
- MAGICSCRAPSTRING))
- {
- if (TrackObjectWriteDataOut(TheTrack,Output)
- == eFileLoadNoError)
- {
- Success = True;
- }
- }
- if (!EndBufferedOutput(Output))
- {
- Success = False;
- }
- }
- else
- {
- CloseFile(BackupFile);
- }
- }
- else
- {
- DeleteFile(BackupFileWhere);
- DisposeFileSpec(BackupFileWhere);
- }
- }
- if (Success)
- {
- MainWindowNewDeleteUndoInfo(TrackList->MainWindow,BackupFileWhere,
- BackupFile);
- DisposeTrackObject(TrackTemp);
- RemoveStringListElement(TrackList->List,TrackTemp,True);
- ArrayDeleteElement(TrackList->TrackArray,Scan);
- TrackList->TrackListChanged = True;
- }
- else
- {
- YesNoCancelType Decision;
-
- Decision = AskYesNoCancel("Unable to save undo information for object. "
- "Delete object anyway?",NIL,"Delete","Cancel",NIL/*nothirdbutton*/);
- if (Decision == eYes)
- {
- DisposeTrackObject(TrackTemp);
- RemoveStringListElement(TrackList->List,TrackTemp,True);
- ArrayDeleteElement(TrackList->TrackArray,Scan);
- TrackList->TrackListChanged = True;
- }
- }
- return;
- }
- }
- EXECUTE(PRERR(AllowResume,"TrackListDeleteTrack: couldn't find object"));
- }
-
-
- /* the name of an track has changed, so the name in the scrolling */
- /* list must also be changed */
- void TrackListTrackNameChanged(TrackListRec* TrackList,
- struct TrackObjectRec* TheTrack)
- {
- char* TrackName;
-
- CheckPtrExistence(TrackList);
- CheckPtrExistence(TheTrack);
- ERROR(ArrayFindElement(TrackList->TrackArray,TheTrack) < 0,
- PRERR(ForceAbort,"TrackListTrackNameChanged: unknown track"));
- TrackName = TrackObjectGetNameCopy(TheTrack);
- if (TrackName != NIL)
- {
- char* TrackNameNullTerminated;
-
- TrackNameNullTerminated = BlockToStringCopy(TrackName);
- if (TrackNameNullTerminated != NIL)
- {
- ChangeStringListElementName(TrackList->List,
- TrackNameNullTerminated,TheTrack);
- ReleasePtr(TrackNameNullTerminated);
- }
- ReleasePtr(TrackName);
- }
- }
-
-
- /* look for a specified track. returns NIL if not found. the name is */
- /* NOT null terminated */
- struct TrackObjectRec* TrackListLookupNamedTrack(TrackListRec* TrackList, char* Name)
- {
- long Scan;
- long Limit;
-
- CheckPtrExistence(TrackList);
- CheckPtrExistence(Name);
- Limit = ArrayGetLength(TrackList->TrackArray);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- TrackObjectRec* Track;
- char* NameCopy;
-
- Track = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- NameCopy = TrackObjectGetNameCopy(Track);
- if (NameCopy != NIL)
- {
- if (PtrSize(Name) == PtrSize(NameCopy))
- {
- if (MemEqu(Name,NameCopy,PtrSize(Name)))
- {
- ReleasePtr(NameCopy);
- return Track;
- }
- }
- ReleasePtr(NameCopy);
- }
- }
- return NIL;
- }
-
-
- /* cancel dependencies where objects have the specified object listed in the */
- /* background. this is called by the specified object when it is dying */
- void TrackListDelinkBackgroundInstances(TrackListRec* TrackList,
- struct TrackObjectRec* TheTrack)
- {
- long Scan;
- long Limit;
-
- CheckPtrExistence(TrackList);
- CheckPtrExistence(TheTrack);
- Limit = ArrayGetLength(TrackList->TrackArray);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- TrackObjectRec* Track;
-
- Track = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- if (Track != TheTrack)
- {
- TrackObjectRemoveBackgroundObj(Track/*listowner*/,TheTrack/*onetoremove*/);
- }
- }
- }
-
-
- /* get the track menu */
- MenuType* TrackListGetTrackMenu(TrackListRec* TrackList)
- {
- CheckPtrExistence(TrackList);
- return TrackList->TrackMenu;
- }
-
-
- /* enable all of the menu items on the menu associated with this track list */
- void TrackListEnableMenuItems(TrackListRec* TrackList)
- {
- long Scan;
- long Limit;
-
- CheckPtrExistence(TrackList);
- Limit = ArrayGetLength(TrackList->TrackArray);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- EnableMenuItem(TrackObjectGetMenuItem((TrackObjectRec*)ArrayGetElement(
- TrackList->TrackArray,Scan)));
- }
- }
-
-
- /* return the track object associated with the specified menu item or NIL if */
- /* there is no such track object */
- struct TrackObjectRec* TrackListLookupMenuItem(TrackListRec* TrackList,
- struct MenuItemType* MenuItem)
- {
- long Scan;
- long Limit;
-
- CheckPtrExistence(TrackList);
- Limit = ArrayGetLength(TrackList->TrackArray);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- TrackObjectRec* TrackObj;
-
- TrackObj = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- if (TrackObjectGetMenuItem(TrackObj) == MenuItem)
- {
- return TrackObj;
- }
- }
- return NIL;
- }
-
-
- /* put a checkmark on all track menu items that occur in this list */
- void TrackListMenuItemCheckmarks(TrackListRec* TrackList,
- ArrayRec* TrackObjList)
- {
- long Limit;
- long Scan;
- long OtherLimit;
-
- CheckPtrExistence(TrackList);
- CheckPtrExistence(TrackObjList);
- Limit = ArrayGetLength(TrackList->TrackArray);
- OtherLimit = ArrayGetLength(TrackObjList);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- long OtherScan;
- TrackObjectRec* PossibleTrack;
-
- PossibleTrack = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- for (OtherScan = 0; OtherScan < OtherLimit; OtherScan += 1)
- {
- TrackObjectRec* Checkable;
-
- Checkable = (TrackObjectRec*)ArrayGetElement(TrackObjList,OtherScan);
- if (Checkable == PossibleTrack)
- {
- SetItemCheckmark(TrackObjectGetMenuItem(Checkable));
- goto FoundItPoint;
- }
- }
- /* jump here when it is found */
- FoundItPoint:
- ;
- }
- }
-
-
- /* the document's name changed, so we need to update the windows */
- void TrackListGlobalNameChange(TrackListRec* TrackList, char* NewFilename)
- {
- long Scan;
- long Limit;
-
- CheckPtrExistence(TrackList);
- Limit = ArrayGetLength(TrackList->TrackArray);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- TrackObjectRec* TrackObj;
-
- TrackObj = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- TrackObjectGlobalNameChange(TrackObj,NewFilename);
- }
- }
-
-
- /* get an array of all of the tracks. it must be disposed of by the caller */
- struct ArrayRec* TrackListGetListOfAllTracks(TrackListRec* TrackList)
- {
- CheckPtrExistence(TrackList);
- return DuplicateArray(TrackList->TrackArray);
- }
-
-
- /* 4-byte little endian number of tracks (positive 2s complement) */
- /* n-bytes data for the track objects */
- /* n-bytes data for background display information (a chunk for each track) */
-
-
- /* read track data from a file. returns True if completely successful. */
- FileLoadingErrors TrackListReadData(TrackListRec* TrackList,
- struct BufferedInputRec* Input)
- {
- signed long NumberOfTracks;
- long Scan;
-
- CheckPtrExistence(TrackList);
- CheckPtrExistence(Input);
-
- /* 4-byte little endian number of tracks (positive 2s complement) */
- if (!ReadBufferedSignedLongLittleEndian(Input,&NumberOfTracks))
- {
- return eFileLoadDiskError;
- }
- if (NumberOfTracks < 0)
- {
- return eFileLoadBadFormat;
- }
-
- /* n-bytes data for objects */
- for (Scan = 0; Scan < NumberOfTracks; Scan += 1)
- {
- TrackObjectRec* Track EXECUTE(= (TrackObjectRec*)0x81818181);
- FileLoadingErrors Error;
-
- /* load the track */
- Error = TrackObjectNewFromFile(&Track,Input,TrackList->CodeCenter,
- TrackList->MainWindow,TrackList);
- if (Error != eFileLoadNoError)
- {
- FailurePoint1:
- return Error;
- }
- CheckPtrExistence(Track);
- /* add it to the string list */
- if (!InsertStringListElement(TrackList->List,NIL,NIL,Track,True))
- {
- FailurePoint2:
- DisposeTrackObject(Track);
- Error = eFileLoadOutOfMemory;
- goto FailurePoint1;
- }
- /* add it to the array */
- if (!ArrayAppendElement(TrackList->TrackArray,Track))
- {
- FailurePoint3:
- RemoveStringListElement(TrackList->List,Track,True);
- goto FailurePoint2;
- }
- /* change the name in the list */
- TrackListTrackNameChanged(TrackList,Track);
- }
-
- for (Scan = 0; Scan < NumberOfTracks; Scan += 1)
- {
- TrackObjectRec* Track;
- FileLoadingErrors Error;
-
- Track = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- CheckPtrExistence(Track);
- Error = LoadBackgroundTrackInfo(Track,Input,TrackList->TrackArray);
- if (Error != eFileLoadNoError)
- {
- return Error;
- }
- }
-
- return eFileLoadNoError;
- }
-
-
- /* write track data to a file. returns True if completely successful. */
- FileLoadingErrors TrackListWriteData(TrackListRec* TrackList,
- struct BufferedOutputRec* Output)
- {
- long NumberOfTracks;
- long Scan;
-
- CheckPtrExistence(TrackList);
- CheckPtrExistence(Output);
-
- /* 4-byte little endian number of tracks (positive 2s complement) */
- NumberOfTracks = ArrayGetLength(TrackList->TrackArray);
- if (!WriteBufferedSignedLongLittleEndian(Output,NumberOfTracks))
- {
- return eFileLoadDiskError;
- }
-
- /* n-bytes data for objects */
- for (Scan = 0; Scan < NumberOfTracks; Scan += 1)
- {
- TrackObjectRec* TrackObj;
- FileLoadingErrors Error;
-
- /* get the track */
- TrackObj = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- /* write the track out to disk */
- Error = TrackObjectWriteDataOut(TrackObj,Output);
- /* handle errors */
- if (Error != eFileLoadNoError)
- {
- return Error;
- }
- }
-
- for (Scan = 0; Scan < NumberOfTracks; Scan += 1)
- {
- TrackObjectRec* Track;
- FileLoadingErrors Error;
-
- Track = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- CheckPtrExistence(Track);
- Error = SaveBackgroundTrackInfo(Track,Output,TrackList->TrackArray);
- if (Error != eFileLoadNoError)
- {
- return Error;
- }
- }
-
- return eFileLoadNoError;
- }
-
-
- /* after a file has been saved, this is called to mark all objects as not modified. */
- void TrackListMarkAllObjectsSaved(TrackListRec* TrackList)
- {
- long Scan;
- long Limit;
-
- CheckPtrExistence(TrackList);
- Limit = ArrayGetLength(TrackList->TrackArray);
- for (Scan = 0; Scan < Limit; Scan += 1)
- {
- TrackObjectRec* TrackObj;
-
- TrackObj = (TrackObjectRec*)ArrayGetElement(TrackList->TrackArray,Scan);
- TrackObjectMarkAsSaved(TrackObj);
- }
- TrackList->TrackListChanged = False;
- }
-
-
- /* copy the selected object in the list to the clipboard. return False if failed. */
- MyBoolean TrackListCopyObject(TrackListRec* TrackList)
- {
- ArrayRec* ListOfSelections;
- MyBoolean TotalSuccessFlag = False;
-
- CheckPtrExistence(TrackList);
- ListOfSelections = GetListOfSelectedItems(TrackList->List);
- if (ListOfSelections != NIL)
- {
- if (ArrayGetLength(ListOfSelections) >= 1)
- {
- TrackObjectRec* TrackTemp;
- FileSpec* TempFileLocation;
-
- TrackTemp = (TrackObjectRec*)ArrayGetElement(ListOfSelections,0);
- /* open the temporary file */
- TempFileLocation = NewTempFileSpec(CODE4BYTES('\?','\?','\?','\?'),
- CODE4BYTES('\?','\?','\?','\?'));
- if (TempFileLocation != NIL)
- {
- FileType* FileDescriptor;
-
- if (OpenFile(TempFileLocation,&FileDescriptor,eReadAndWrite))
- {
- BufferedOutputRec* BufferedFile;
-
- BufferedFile = NewBufferedOutput(FileDescriptor);
- if (BufferedFile != NIL)
- {
- MyBoolean WriteSucceeded = False;
-
- if (WriteBufferedOutput(BufferedFile,sizeof(MAGICSCRAPSTRING),
- MAGICSCRAPSTRING))
- {
- if (TrackObjectWriteDataOut(TrackTemp,BufferedFile)
- == eFileLoadNoError)
- {
- WriteSucceeded = True;
- }
- }
- if (EndBufferedOutput(BufferedFile) && WriteSucceeded)
- {
- char* Buffer;
- long NumberOfBytes;
-
- NumberOfBytes = GetFileLength(FileDescriptor);
- Buffer = AllocPtrCanFail(NumberOfBytes,
- "TrackListCopyObject: scrap buffer");
- if (Buffer != NIL)
- {
- if (SetFilePosition(FileDescriptor,0))
- {
- if (0 == ReadFromFile(FileDescriptor,
- Buffer,NumberOfBytes))
- {
- if (SetScrapToThis(Buffer))
- {
- TotalSuccessFlag = True;
- }
- }
- }
- ReleasePtr(Buffer);
- }
- }
- }
- CloseFile(FileDescriptor);
- }
- DeleteFile(TempFileLocation);
- DisposeFileSpec(TempFileLocation);
- }
- }
- DisposeArray(ListOfSelections);
- }
- return TotalSuccessFlag;
- }
-
-
- /* try to paste the clipboard in as a track. returns False if it failed or the */
- /* clipboard did not contain a track. */
- MyBoolean TrackListPasteObject(TrackListRec* TrackList)
- {
- MyBoolean TotalSuccessFlag = False;
- char* Scrap;
-
- CheckPtrExistence(TrackList);
- Scrap = GetCopyOfScrap();
- if (Scrap != NIL)
- {
- FileSpec* TempFileLocation;
-
- TempFileLocation = NewTempFileSpec(CODE4BYTES('\?','\?','\?','\?'),
- CODE4BYTES('\?','\?','\?','\?'));
- if (TempFileLocation != NIL)
- {
- FileType* FileDescriptor;
-
- if (OpenFile(TempFileLocation,&FileDescriptor,eReadAndWrite))
- {
- BufferedOutputRec* BufferedFile;
-
- BufferedFile = NewBufferedOutput(FileDescriptor);
- if (BufferedFile != NIL)
- {
- MyBoolean WriteSucceeded = False;
-
- if (WriteBufferedOutput(BufferedFile,PtrSize(Scrap),Scrap))
- {
- WriteSucceeded = True;
- }
- if (EndBufferedOutput(BufferedFile) && WriteSucceeded)
- {
- TotalSuccessFlag = TrackListPasteFromFile(TrackList,
- FileDescriptor);
- }
- }
- CloseFile(FileDescriptor);
- }
- DeleteFile(TempFileLocation);
- DisposeFileSpec(TempFileLocation);
- }
- ReleasePtr(Scrap);
- }
- return TotalSuccessFlag;
- }
-
-
- /* try to paste the track object in from the file */
- MyBoolean TrackListPasteFromFile(TrackListRec* TrackList,
- struct FileType* File)
- {
- MyBoolean TotalSuccessFlag = False;
-
- CheckPtrExistence(TrackList);
- if (SetFilePosition(File,0))
- {
- BufferedInputRec* InputFile;
-
- InputFile = NewBufferedInput(File);
- if (InputFile != NIL)
- {
- char HeaderTest[sizeof(MAGICSCRAPSTRING)];
-
- if (ReadBufferedInput(InputFile,sizeof(MAGICSCRAPSTRING),HeaderTest))
- {
- if (MemEqu(MAGICSCRAPSTRING,HeaderTest,sizeof(MAGICSCRAPSTRING)))
- {
- TrackObjectRec* TrackTemp EXECUTE(= (TrackObjectRec*)0x81818181);
-
- if (eFileLoadNoError == TrackObjectNewFromFile(&TrackTemp,InputFile,
- TrackList->CodeCenter,TrackList->MainWindow,TrackList))
- {
- CheckPtrExistence(TrackTemp);
- /* add it to the scrolling object list */
- if (!InsertStringListElement(TrackList->List,NIL,NIL,TrackTemp,True))
- {
- FailurePoint:
- DisposeTrackObject(TrackTemp);
- }
- else
- {
- MainWindowDeselectAllOtherStringLists(TrackList->MainWindow,TrackList);
- SelectStringListElement(TrackList->List,TrackTemp);
- MakeStringListSelectionVisible(TrackList->List);
- /* add it to the array */
- if (!ArrayAppendElement(TrackList->TrackArray,TrackTemp))
- {
- RemoveStringListElement(TrackList->List,TrackTemp,True);
- goto FailurePoint;
- }
- else
- {
- /* change the name in the list */
- TrackListTrackNameChanged(TrackList,TrackTemp);
- TotalSuccessFlag = True;
- TrackList->TrackListChanged = True;
- }
- }
- }
- }
- }
- }
- EndBufferedInput(InputFile);
- }
- return TotalSuccessFlag;
- }
-